package com.fs.user.web;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2.创建解析器
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        //3.解析request对象得到FileItem的集合
        try {
            List<FileItem> fileItems = fileUpload.parseRequest(request);
            //4.遍历 List<FileItem>
            for (FileItem fileItem : fileItems) {
                //判断是否是文件域   isFormField()  返回true: 普通表单项  false: 文件域
                //System.out.println(fileItem.isFormField());
                if(fileItem.isFormField()){
                    //获取请求参数名  getFieldName(), 请求参数值  getString(String encoding)
                    System.out.println("参数名:"+fileItem.getFieldName()+",值:"+fileItem.getString("UTF-8"));
                }else{ //文件域
                    //获取上传的原始的文件名   getName()
                    System.out.println("上传的文件名:"+fileItem.getName());
                    //System.out.println("上传文件....");
                    //上传文件:  fileItem的write(File )
                    File savePathFile = new File("D:\\test"); //保存路径
                    //判断文件夹是否存在, 如果不存在,创建文件夹
                    if(!savePathFile.exists()){//不存在
                        savePathFile.mkdirs();
                    }
                    // 使用客户端上传的文件名作为服务器保存的文件名, 可能多个客户端使用相同名字,造成覆盖文件
                    //File saveFile = new  File(savePathFile,fileItem.getName());

                    //服务器自动生成不重复的文件名   1) 时间戳(毫秒) + 区分名
                    // 2) JAVA提供了随机生成UUID方法, 算法,  32位16进制字符串   UUID
                    // 3)其他算法:  雪花算法
                    /*
                    long time = System.currentTimeMillis();
                     */

                    //UUID的方式
                    String time = UUID.randomUUID().toString().toUpperCase().replace("-","");  // 小写  加-
                    //后缀名  与上传的文件名的后缀名一样   xxx.jpg
                    String fileName = fileItem.getName();


                    String suffix = fileName.substring(fileName.lastIndexOf("."));

                    File saveFile = new  File(savePathFile,time+suffix);

                    fileItem.write(saveFile);
                }

            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }


}
